﻿using Newtonsoft.Json;

namespace Infrastructure.Model.UserAuth
{
    /// <summary>
    /// 登录用户上下文实体
    /// 封装经过认证的用户身份信息及权限上下文
    /// 适用于需要细粒度权限控制的系统场景
    /// </summary>
    public class LoginUser
    {
        /// <summary>
        /// 用户唯一标识符
        /// 建议格式：GUID 或 系统生成的唯一编码
        /// 示例："U1001" 或 "5f3d7e9a-1c4b-4a8d-bf2c-123456789abc"
        /// </summary>
        public string UserId { get; set; }

        /// <summary>
        /// 用户显示名称
        /// 用于界面展示的友好名称（非登录账号）
        /// 示例："张三" 或 "Admin"
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// 主属部门编码
        /// 表示用户在组织架构中的主要归属部门
        /// 示例："DEPT_IT" 或 "SALES_EAST"
        /// </summary>
        public string Dept { get; set; }

        /// <summary>
        /// 身份验证令牌（敏感字段）
        /// JWT/Bearer Token，有效期通常为30分钟
        /// 建议在序列化时忽略此字段
        /// </summary>
        [JsonIgnore]
        public string Token { get; set; }

        /// <summary>
        /// 用户所属安全组/角色ID集合
        /// 用于基于角色的访问控制（RBAC）
        /// 示例：["AdminGroup", "Auditor"]
        /// </summary>
        public List<string> GroupIds { get; set; } = new List<string>();

        /// <summary>
        /// 细粒度权限标识集合
        /// 用于基于属性的访问控制（ABAC）
        /// 示例：["Order.Read", "Report.Export"]
        /// </summary>
        public List<string> Permissions { get; set; } = new List<string>();


        /// <summary>
        /// 可访问的地理位置白名单
        /// 遵循ISO 3166-2地区编码标准
        /// 示例：["CN-BJ", "US-CA"]
        /// </summary>
        public List<string> Locations { get; set; } = new List<string>();

        /// <summary>
        /// 部门-位置矩阵权限配置
        /// 支持用户在多个部门的区域权限配置
        /// 示例：IT部门+北京地区，财务部+上海地区
        /// </summary>
        public List<UserDeptLocation> DeptLocations { get; set; } = new List<UserDeptLocation>();

        /// <summary>
        /// 安全组详细信息集合
        /// 包含组权限、有效期等扩展属性
        /// </summary>
        public List<GroupDetail> GroupDetails { get; set; } = new List<GroupDetail>();

        public LoginUser()
        {
        }

        /// <summary>
        /// 最小化用户上下文构造
        /// 适用于基础认证场景
        /// </summary>
        /// <param name="userId">用户唯一标识</param>
        /// <param name="userName">用户显示名称</param>
        public LoginUser(string userId, string userName)
        {
            UserId = userId ?? throw new ArgumentNullException(nameof(userId));
            UserName = userName ?? throw new ArgumentNullException(nameof(userName));
        }

        /// <summary>
        /// 完整用户上下文构造
        /// 适用于系统初始化或缓存加载
        /// </summary>
        /// <param name="userId">用户唯一标识</param>
        /// <param name="userName">用户显示名称</param>
        /// <param name="dept">主属部门编码</param>
        /// <param name="roleIds">角色/组ID集合</param>
        /// <param name="permissions">权限标识集合</param>
        /// <param name="locations">地理白名单</param>
        /// <param name="deptLocations">部门位置矩阵</param>
        /// <param name="groupDetails">安全组详情</param>
        public LoginUser(
            string userId,
            string userName,
            string dept,
            List<string> roleIds,
            List<string> permissions,
            List<string> locations,
            List<UserDeptLocation> deptLocations,
            List<GroupDetail> groupDetails)
        {
            UserId = userId ?? throw new ArgumentNullException(nameof(userId));
            UserName = userName ?? throw new ArgumentNullException(nameof(userName));
            Dept = dept;
            GroupIds = roleIds ?? new List<string>();
            Permissions = permissions ?? new List<string>();
            Locations = locations ?? new List<string>();
            DeptLocations = deptLocations ?? new List<UserDeptLocation>();
            GroupDetails = groupDetails ?? new List<GroupDetail>();
        }


    }
}